home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / dev / obero / oberon_lib.lha / oberon-a / source1.lha / source / Library / BigSets.mod next >
Text File  |  1994-08-08  |  5KB  |  191 lines

  1. (***************************************************************************
  2.  
  3.      $RCSfile: BigSets.mod $
  4.   Description: An implementation of sets bigger than a machine word.
  5.  
  6.    Created by: fjc (Frank Copeland)
  7.     $Revision: 1.3 $
  8.       $Author: fjc $
  9.         $Date: 1994/08/08 16:24:39 $
  10.  
  11.   Copyright © 1994, Frank Copeland.
  12.   This file is part of the Oberon-A Library.
  13.   See Oberon-A.doc for conditions of use and distribution.
  14.  
  15. ***************************************************************************)
  16.  
  17. MODULE BigSets;
  18.  
  19. (*
  20. ** $C= CaseChk       $I= IndexChk  $L+ LongAdr   $N= NilChk
  21. ** $P= PortableCode  $R= RangeChk  $S= StackChk  $T= TypeChk
  22. ** $V= OvflChk       $Z= ZeroVars
  23. *)
  24.  
  25. IMPORT U := Util;
  26.  
  27. CONST
  28.  
  29.   BitsPerSet * = MAX (SET) + 1;
  30.   CharSetElements = ORD (MAX (CHAR)) DIV BitsPerSet;
  31.  
  32. TYPE
  33.  
  34.   CHARSET * = ARRAY CharSetElements OF SET;
  35.  
  36. (*------------------------------------*)
  37. PROCEDURE Empty * ( VAR set : ARRAY OF SET );
  38.  
  39.   VAR index : INTEGER;
  40.  
  41. BEGIN (* Empty *)
  42.   index := 0;
  43.   WHILE index < LEN (set) DO
  44.     set [index] := {};
  45.     INC (index)
  46.   END; (* WHILE *)
  47. END Empty;
  48.  
  49. (*------------------------------------*)
  50. PROCEDURE IsEmpty * ( VAR set : ARRAY OF SET ) : BOOLEAN;
  51.  
  52.   VAR index : INTEGER; empty : BOOLEAN;
  53.  
  54. BEGIN (* IsEmpty *)
  55.   empty := TRUE; index := 0;
  56.   WHILE empty & (index < LEN (set)) DO
  57.     empty := (set [index] = {});
  58.     INC( index );
  59.   END; (* WHILE *)
  60.   RETURN empty;
  61. END IsEmpty;
  62.  
  63. (*------------------------------------*)
  64. PROCEDURE In * ( VAR set : ARRAY OF SET; element : INTEGER ) : BOOLEAN;
  65.  
  66.   VAR index, bit : INTEGER;
  67.  
  68. BEGIN (* In *)
  69.   index := element DIV BitsPerSet;
  70.   bit := element MOD BitsPerSet;
  71.   RETURN (bit IN set [index]);
  72. END In;
  73.  
  74. (*------------------------------------*)
  75. PROCEDURE Incl * ( VAR set : ARRAY OF SET; element : INTEGER );
  76.  
  77.   VAR index, bit : INTEGER;
  78.  
  79. BEGIN (* Incl *)
  80.   index := element DIV BitsPerSet;
  81.   bit := element MOD BitsPerSet;
  82.   INCL (set [index], bit);
  83. END Incl;
  84.  
  85. (*------------------------------------*)
  86. PROCEDURE Excl * ( VAR set : ARRAY OF SET; element : INTEGER );
  87.  
  88.   VAR index, bit : INTEGER;
  89.  
  90. BEGIN (* Excl *)
  91.   index := element DIV BitsPerSet;
  92.   bit := element MOD BitsPerSet;
  93.   EXCL (set [index], bit);
  94. END Excl;
  95.  
  96. (*------------------------------------*)
  97. PROCEDURE InclRange * (
  98.   VAR set : ARRAY OF SET; firstElement, lastElement : INTEGER );
  99.  
  100.   VAR index, bit, count : INTEGER;
  101.  
  102. BEGIN (* InclRange *)
  103.   index := firstElement DIV BitsPerSet;
  104.   bit := firstElement MOD BitsPerSet;
  105.   count := lastElement - firstElement + 1;
  106.   WHILE count > 0 DO
  107.     INCL (set [index], bit);
  108.     INC (bit);
  109.     IF bit = BitsPerSet THEN
  110.       bit := 0;
  111.       INC (index);
  112.     END; (* IF *)
  113.     DEC (count);
  114.   END; (* WHILE *)
  115. END InclRange;
  116.  
  117. (*------------------------------------*)
  118. PROCEDURE ExclRange * (
  119.   VAR set : ARRAY OF SET; firstElement, lastElement : INTEGER );
  120.  
  121.   VAR index, bit, count : INTEGER;
  122.  
  123. BEGIN (* ExclRange *)
  124.   index := firstElement DIV BitsPerSet;
  125.   bit := firstElement MOD BitsPerSet;
  126.   count := lastElement - firstElement + 1;
  127.   WHILE count > 0 DO
  128.     EXCL (set [index], bit);
  129.     INC (bit);
  130.     IF bit = BitsPerSet THEN
  131.       bit := 0;
  132.       INC (index);
  133.     END; (* IF *)
  134.     DEC (count);
  135.   END; (* WHILE *)
  136. END ExclRange;
  137.  
  138. (*------------------------------------*)
  139. PROCEDURE Union * ( VAR firstSet, secondSet, destSet : ARRAY OF SET );
  140.  
  141.   VAR index, maxIndex : INTEGER;
  142.  
  143. BEGIN (* Union *)
  144.   index := 0; maxIndex := SHORT (LEN (firstSet));
  145.   WHILE index < maxIndex DO
  146.     destSet [index] := firstSet [index] + secondSet [index];
  147.     INC (index)
  148.   END; (* WHILE *)
  149. END Union;
  150.  
  151. (*------------------------------------*)
  152. PROCEDURE Difference * ( VAR firstSet, secondSet, destSet : ARRAY OF SET );
  153.  
  154.   VAR index, maxIndex : INTEGER;
  155.  
  156. BEGIN (* Difference *)
  157.   index := 0; maxIndex := SHORT (LEN (firstSet));
  158.   WHILE index < maxIndex DO
  159.     destSet [index] := firstSet [index] - secondSet [index];
  160.     INC (index)
  161.   END; (* WHILE *)
  162. END Difference;
  163.  
  164. (*------------------------------------*)
  165. PROCEDURE Intersection * (VAR firstSet, secondSet, destSet : ARRAY OF SET);
  166.  
  167.   VAR index, maxIndex : INTEGER;
  168.  
  169. BEGIN (* Intersection *)
  170.   index := 0; maxIndex := SHORT (LEN (firstSet));
  171.   WHILE index < maxIndex DO
  172.     destSet [index] := firstSet [index] * secondSet [index];
  173.     INC (index)
  174.   END; (* WHILE *)
  175. END Intersection;
  176.  
  177. (*------------------------------------*)
  178. PROCEDURE SymmetricDiff * (VAR firstSet, secondSet, destSet : ARRAY OF SET);
  179.  
  180.   VAR index, maxIndex : INTEGER;
  181.  
  182. BEGIN (* SymmetricDiff *)
  183.   index := 0; maxIndex := SHORT (LEN (firstSet));
  184.   WHILE index < maxIndex DO
  185.     destSet [index] := firstSet [index] / secondSet [index];
  186.     INC (index)
  187.   END; (* WHILE *)
  188. END SymmetricDiff;
  189.  
  190. END BigSets.
  191.